【アップデート情報】テーブルの変更履歴を取得するCHANGES関数が新たに追加されました

【アップデート情報】テーブルの変更履歴を取得するCHANGES関数が新たに追加されました

Clock Icon2024.07.23

Google Cloudデータエンジニアのはんざわです。
2024年7月22日のアップデートでCHANGESのテーブル関数がプレビューとして、新たに追加されました。

https://cloud.google.com/bigquery/docs/release-notes#July_22_2024

本ブログでは、追加されたばかりのCHANGESのテーブル関数を触ってみたいと思います。

CHANGES とは?

https://cloud.google.com/bigquery/docs/change-history

CHANGESのテーブル関数では、BigQueryのテーブル変更履歴を追跡することができます。
BigQueryのコンソール画面からSQLで指定した時間範囲に行われた特定の種類の変更を確認することができます。

似たようなテーブル関数にAPPENDSが存在します。
APPENDSCHANGESでは、取得可能な情報が若干異なります。

APPENDSで取得可能な情報は次の通りです。

同様にCHANGESで取得可能な情報は次の通りです。

  • CREATE TABLEのDDLステートメント
  • INSERTのDMLステートメント
  • MERGEのDMLステートメントで変更されたデータ
  • UPDATEのDMLステートメント
  • DELETEのDMLステートメント
  • BigQueryへのデータロード
  • ストリーミングによるデータの取り込み
  • TRUNCATE TABLEのDMLステートメント
  • WRITE_TRUNCATEで構成されたジョブ
  • 個々のテーブルのパーティションの削除

これらを比較して分かるようにCHANGESAPPENDSよりも多くの変更情報を取得することが可能になっています。

さっそくですが、CHANGESを触ってみたいと思います。

CHANGES を触ってみる

https://cloud.google.com/bigquery/docs/reference/standard-sql/table-functions-built-in#changes

CHANGES(
  TABLE table,
  start_timestamp DEFAULT NULL,
  end_timestamp)

CHANGESの使い方は非常に簡単です。
上記のようにTABLEにテーブル名を与え、テーブルの変更履歴を確認したい期間をstart_timestampend_timestampに与えるだけで確認することができます。

start_timestampには、NULLを指定することも可能でテーブル作成以降の全てのテーブルの変更履歴を取得することが可能です。
一方でend_timestampには、少なくとも現在の時刻から10分前である必要があり、start_timestampend_timestampの間の最大時間範囲は1日である必要があるようです。

end_timestampに現在の時刻から10分以内の時刻を与えると次のようなエラーが発生することを確認しています。

試しに適当なテーブルの変更履歴を以下のクエリで確認してみます。

SELECT
  *
FROM
  CHANGES(
    TABLE samples.github_nested,
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY),
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 15 MINUTE)
  )

ですが、実行すると以下のようなエラーが発生しました。
どうやらテーブルの変更履歴を確認するためには、enable_change_historyのオプションをTRUEにする必要があるようです。

別途、以下のクエリでenable_change_historyのオプションを有効にしたテーブルを作成し、変更履歴を確認してみたいと思います。

CREATE TABLE samples.change_history
OPTIONS (
>  enable_change_history = TRUE
) AS
SELECT
  1 AS id,
  'apple' AS name

また、INSERTUPDATEDELETEステートメントも実行してみます。

/* INSERT Statement */
INSERT INTO samples.change_history
SELECT
  2 AS id,
  'banana' AS name

/* UPDATE Statement */
UPDATE samples.change_history
SET
  name = 'melon'
WHERE
  id = 2

/* DELETE Statement */
DELETE samples.change_history
WHERE
  id = 2

改めて以下のクエリで変更履歴を確認してみます。

SELECT
  *
FROM
  CHANGES (
    TABLE `samples.change_history`,
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY),
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 15 MINUTE)
  )

全てのデータ操作が以下のキャプチャのように確認することができました!

スクリーンショット 2024-07-23 15.26.20

料金について

変更履歴を確認するためにenable_change_historyTRUEに設定すると、BigQueryはテーブルの変更メタデータを保存するようになります。
このメタデータの保存には、BigQueryのストレージコストが発生するようになります。
通常であれば少額で済みますが、変更操作が多いテーブルや大規模なテーブルのデータ操作は予想外の課金が発生する可能性があるので気をつけましょう。

https://cloud.google.com/bigquery/pricing#storage

まとめ

今回のブログでは、新たにプレビューで追加されたCHANGESを紹介しました。
この機能を有効にすることでデータの更新履歴の管理が容易になると思われます。
追加で課金が発生するようになりますが、是非活用を検討してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.